์ด๊ณ ์ JavaScript ๋ฒ๋ค๋ฌ ๋ฐ ๋ณํ๊ธฐ์ธ ESBuild๋ฅผ ํ์ํด๋ณด์ธ์. ๋ค์ํ ํ๊ฒฝ์์ ์๋, ํจ์จ์ฑ ๋ฐ ํฅ์๋ ์ฑ๋ฅ์ ์ํด ์น ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
ESBuild: ์ด๊ณ ์ JavaScript ๋ฒ๋ค๋ง ๋ฐ ๋ณํ
๋น ๋ฅด๊ฒ ๋ณํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋น๋ ๋๊ตฌ๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ํฌํ๋ก๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ESBuild๋ JavaScript ๋ฒ๋ค๋ง ๋ฐ ๋ณํ์์ ๋น๊ตํ ์ ์๋ ์๋์ ํจ์จ์ฑ์ ์ ๊ณตํ๋ฉฐ ๊ฒ์ ์ฒด์ธ์ ๋ก ๋ถ์ํ์ต๋๋ค. ์ด ๊ธฐ์ฌ๋ ESBuild์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๋ฉฐ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ธฐ๋ฅ, ์ด์ ๋ฐ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ดํด๋ด ๋๋ค.
What is ESBuild?
ESBuild๋ Go๋ก ์์ฑ๋ JavaScript ๋ฒ๋ค๋ฌ ๋ฐ ๋ณํ๊ธฐ์ ๋๋ค. ์ฃผ์ ๋ชฉํ๋ Webpack, Parcel ๋ฐ Rollup๊ณผ ๊ฐ์ ๊ธฐ์กด JavaScript ๊ธฐ๋ฐ ๋ฒ๋ค๋ฌ์ ๋นํด ํจ์ฌ ๋น ๋ฅธ ๋น๋ ์๊ฐ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ESBuild๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ต์ ํ๋ฅผ ํตํด ์ด ์๋๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
- ๋์์ฑ: ESBuild๋ Go์ ๋์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ง์ ์์ ์ ๋ณ๋ ฌํํฉ๋๋ค.
- ๋ค์ดํฐ๋ธ ์ฝ๋: Go๋ก ์์ฑ๋ ESBuild๋ JavaScript ๋ฐํ์ ํ๊ฒฝ์ ์ค๋ฒํค๋๋ฅผ ํผํฉ๋๋ค.
- ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ: ESBuild๋ ์ฝ๋ ๊ตฌ๋ฌธ ๋ถ์, ๋ณํ ๋ฐ ์์ฑ์ ์ํด ์ต์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
ESBuild๋ ๊ด๋ฒ์ํ ๊ธฐ๋ฅ์ ์ง์ํ์ฌ ์ต์ ์น ๊ฐ๋ฐ์ ์ํ ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ์ ๋๋ค.
- JavaScript ๋ฐ TypeScript ๋ฒ๋ค๋ง: ์ฌ๋ฌ JavaScript ๋ฐ TypeScript ํ์ผ์ ์ต์ ํ๋ ๋ฒ๋ค๋ก ๊ฒฐํฉํฉ๋๋ค.
- JSX ๋ฐ TSX ๋ณํ: JSX ๋ฐ TSX ๊ตฌ๋ฌธ์ ํ์ค JavaScript๋ก ๋ณํํฉ๋๋ค.
- CSS ๋ฐ CSS ๋ชจ๋ ์ง์: ๋ฒ์๊ฐ ์ง์ ๋ ์คํ์ผ ์ง์ ์ ์ํด CSS ๋ชจ๋์ ํฌํจํ CSS ํ์ผ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฝ๋ ๋ถํ : ์ฃผ๋ฌธํ ๋ก๋ฉ์ ์ํด ์ฝ๋๋ฅผ ๋ ์์ ์ฒญํฌ๋ก ๋๋์ด ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
- ์ต์ํ: ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณ ๋ณ์ ์ด๋ฆ์ ์ค์ฌ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- ํธ๋ฆฌ ์์ดํน: ๋ฐ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋์ฑ ์ค์ ๋๋ค.
- ์์ค ๋งต: ๋ ์ฌ์ด ๋๋ฒ๊น ์ ์ํด ์์ค ๋งต์ ์์ฑํฉ๋๋ค.
- ํ๋ฌ๊ทธ์ธ ์์คํ : ์ฌ์ฉ์ ์ง์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ESBuild์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค.
Why Use ESBuild?
ESBuild ์ฌ์ฉ์ ์ฃผ์ ์ด์ ์ ์๋์ ๋๋ค. ๋น๋ ์๊ฐ์ ์ข ์ข ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค. ์ด ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ๋ ๋น ๋ฅธ ๋น๋๋ ๋๊ธฐ ์๊ฐ์ด ์ค์ด๋ค๊ณ ์ฝ๋ฉ ๋ฐ ํ ์คํธ ์๊ฐ์ด ๋์ด๋ฉ๋๋ค.
- ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ: ๋ณด๋ค ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์์ฐ์ฑ ๋ฐ ์ง๋ฌด ๋ง์กฑ๋๋ฅผ ๋์ ๋๋ค.
- ๋ ๋น ๋ฅธ CI/CD ํ์ดํ๋ผ์ธ: CI/CD ํ์ดํ๋ผ์ธ์์ ๋น๋ ์๊ฐ์ด ๋จ์ถ๋๋ฉด ๋ฐฐํฌ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ ํผ๋๋ฐฑ ๋ฃจํ๊ฐ ๋นจ๋ผ์ง๋๋ค.
์๋ ์ธ์๋ ESBuild๋ ๋ค์๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฐ๋ ฅํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์์ฑ: ESBuild์ ๊ตฌ์ฑ์ ์ข ์ข ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ๊ฐ๋จํ๊ณ ๊ฐ๋จํฉ๋๋ค.
- ์ต์ ๊ธฐ๋ฅ: ESBuild๋ ์ต์ JavaScript ๋ฐ TypeScript ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
- ์ฑ์ฅํ๋ ์ํ๊ณ: ๋ค๋ฅธ ๋ฒ๋ค๋ฌ๋ณด๋ค ์ต์ ์ด์ง๋ง ESBuild์ ์ํ๊ณ๋ ์ปค๋ฎค๋ํฐ์์ ์ ๊ณตํ๋ ํ๋ฌ๊ทธ์ธ ๋ฐ ํตํฉ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์์ต๋๋ค.
Getting Started with ESBuild
ESBuild๋ฅผ ์์ํ๋ ค๋ฉด ์์คํ ์ Node.js ๋ฐ npm(๋๋ Yarn)์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
Installation
ESBuild๋ฅผ ์ ์ญ์ ์ผ๋ก ๋๋ ํ๋ก์ ํธ ์ข ์์ฑ์ผ๋ก ์ค์นํฉ๋๋ค.
npm install -g esbuild
# or
npm install --save-dev esbuild
Basic Usage
ESBuild๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋ช ๋ น์ค์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
esbuild input.js --bundle --outfile=output.js
์ด ๋ช
๋ น์ input.js
์ ๋ชจ๋ ์ข
์์ฑ์ output.js
๋ผ๋ ๋จ์ผ ํ์ผ๋ก ๋ฒ๋ค๋งํฉ๋๋ค.
Configuration File (Optional)
๋ ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๊ตฌ์ฑ ํ์ผ(์: esbuild.config.js
)์ ๋ง๋ค์ด ๋น๋ ์ต์
์ ์ ์ํ ์ ์์ต๋๋ค.
// esbuild.config.js
const esbuild = require('esbuild');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm', // or 'cjs' for CommonJS
minify: true,
sourcemap: true,
}).catch(() => process.exit(1));
๊ทธ๋ฐ ๋ค์ ๊ตฌ์ฑ ํ์ผ๋ก ESBuild๋ฅผ ์คํํฉ๋๋ค.
node esbuild.config.js
Advanced Features and Configuration
ESBuild๋ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ธฐ ์ํ ๊ด๋ฒ์ํ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ๊ตฌ์ฑ ์ต์ ์ ๋๋ค.
Code Splitting
์ฝ๋ ๋ถํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ฃผ๋ฌธํ์ผ๋ก ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ด๋ก๋ํ์ฌ ๋ฏธ๋ฆฌ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ๋ JavaScript์ ์์ ์ค์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฝ๋ ๋ถํ ์ ํ์ฑํํ๋ ค๋ฉด format: 'esm'
์ต์
์ ์ฌ์ฉํ๊ณ ์ถ๋ ฅ ํ์ผ์ ๋ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outdir: 'dist',
format: 'esm',
splitting: true,
minify: true,
sourcemap: true,
}).catch(() => process.exit(1));
ESBuild๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ๊ณผ ๋์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ชจ๋์ ๋ํด ๋ณ๋์ ์ฒญํฌ๋ฅผ ์๋์ผ๋ก ๋ง๋ญ๋๋ค.
Minification and Tree Shaking
์ต์ํ๋ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณ ๋ณ์ ์ด๋ฆ์ ์ค์ด๋ฉฐ ๊ธฐํ ์ต์ ํ๋ฅผ ์ ์ฉํ์ฌ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. ํธ๋ฆฌ ์์ดํน์ ๋ฐ๋ ์ฝ๋(์คํ๋์ง ์๋ ์ฝ๋)๋ฅผ ์ ๊ฑฐํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋์ฑ ์ค์ ๋๋ค.
์ต์ํ ๋ฐ ํธ๋ฆฌ ์์ดํน์ ํ์ฑํํ๋ ค๋ฉด minify: true
์ต์
์ ์ฌ์ฉํฉ๋๋ค.
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm',
minify: true,
treeShaking: true, // Enabled by default when minify is true
sourcemap: true,
}).catch(() => process.exit(1));
ํธ๋ฆฌ ์์ดํน์ ์ต์ํ๊ฐ ํ์ฑํ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
Plugins
ESBuild์ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค. ํ๋ฌ๊ทธ์ธ์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ง์ ํ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๋ก๋.
- ํน์ ๋ฐฉ์์ผ๋ก ์ฝ๋ ๋ณํ.
- ๋ค๋ฅธ ๋น๋ ๋๊ตฌ์ ํตํฉ.
๋ค์์ __VERSION__
์ ๋ชจ๋ ๋ฐ์์ ํจํค์ง์ ํ์ฌ ๋ฒ์ ์ผ๋ก ๋ฐ๊พธ๋ ๊ฐ๋จํ ESBuild ํ๋ฌ๊ทธ์ธ์ ์์
๋๋ค.
// version-plugin.js
const fs = require('fs');
const path = require('path');
function versionPlugin() {
return {
name: 'version-plugin',
setup(build) {
build.onLoad({ filter: /\.(js|ts|jsx|tsx)$/ }, async (args) => {
const contents = await fs.promises.readFile(args.path, 'utf8');
const packageJsonPath = path.resolve(process.cwd(), 'package.json');
const packageJson = JSON.parse(await fs.promises.readFile(packageJsonPath, 'utf8'));
const version = packageJson.version;
const modifiedContents = contents.replace(/__VERSION__/g, version);
return {
contents: modifiedContents,
loader: args.loader,
};
});
},
};
}
module.exports = versionPlugin;
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ค๋ฉด ESBuild ๊ตฌ์ฑ์ ํฌํจํ์ญ์์ค.
// esbuild.config.js
const esbuild = require('esbuild');
const versionPlugin = require('./version-plugin');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm',
minify: true,
sourcemap: true,
plugins: [versionPlugin()],
}).catch(() => process.exit(1));
Target Environments
ESBuild๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๋ํ ๋์ ํ๊ฒฝ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋์์ผ๋ก ํ๋ ๋ธ๋ผ์ฐ์ ๋๋ Node.js ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์ง์ญ๊ณผ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์๋ก ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
target
์ต์
์ ์ฌ์ฉํ์ฌ ๋์ ํ๊ฒฝ์ ์ง์ ํฉ๋๋ค.
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm',
minify: true,
sourcemap: true,
target: ['es2015', 'chrome58', 'firefox57', 'safari11', 'edge16'],
}).catch(() => process.exit(1));
์ด ์์์ ESBuild๋ ์ฝ๋๋ฅผ ES2015, Chrome 58, Firefox 57, Safari 11 ๋ฐ Edge 16๊ณผ ํธํ๋๋๋ก ๋ณํํฉ๋๋ค.
ESBuild vs. Other Bundlers
ESBuild๋ ์๋นํ ์๋ ์ด์ ์ ์ ๊ณตํ์ง๋ง Webpack, Parcel ๋ฐ Rollup๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฒ๋ค๋ฌ์ ๋น๊ตํ์ฌ ์ ์ถฉ์ ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Webpack
Webpack์ ํฌ๊ณ ์ฑ์ํ ์ํ๊ณ๋ฅผ ๊ฐ์ถ ๊ณ ๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋ฒ๋ค๋ฌ์ ๋๋ค. ๊ด๋ฒ์ํ ๊ธฐ๋ฅ๊ณผ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ์ง๋ง ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์ง์ ์ฅ๋ฒฝ์ด ๋ ์ ์์ต๋๋ค. ESBuild๋ ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ Webpack๋ณด๋ค ํจ์ฌ ๋น ๋ฅด์ง๋ง ํน์ ์ฌ์ฉ ์ฌ๋ก์์๋ Webpack์ ๊ด๋ฒ์ํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
Parcel
Parcel์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์ ๋ก ๊ตฌ์ฑ ๋ฒ๋ค๋ฌ์ ๋๋ค. ํ๋ก์ ํธ์ ์์ฐ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฒ๋ค๋งํ์ง๋ง ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ด ๋ถ์กฑํ๋ฉด ๋ณต์กํ ํ๋ก์ ํธ์ ์ ํ์ด ์์ ์ ์์ต๋๋ค. ESBuild๋ ์ผ๋ฐ์ ์ผ๋ก Parcel๋ณด๋ค ๋น ๋ฅด๊ณ ๋ ๋ง์ ๊ตฌ์ฑ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
Rollup
Rollup์ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋ฒ๋ค๋ฌ์ ๋๋ค. ํธ๋ฆฌ ์์ดํน์ ๋ฐ์ด๋๊ณ ๊ณ ๋๋ก ์ต์ ํ๋ ๋ฒ๋ค์ ์์ฑํฉ๋๋ค. ESBuild๋ ์ผ๋ฐ์ ์ผ๋ก ํนํ ๋ ํฐ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Rollup๋ณด๋ค ๋น ๋ฅด๋ฉฐ ๋ค์ํ ํ์ผ ์ ํ ๋ฐ ๊ธฐ๋ฅ์ ๋ํ ๋ณด๋ค ํฌ๊ด์ ์ธ ์ง์์ ์ ๊ณตํฉ๋๋ค.
๋ค์์ ์ฃผ์ ์ฐจ์ด์ ์ ์์ฝํ ํ์ ๋๋ค.
Feature | ESBuild | Webpack | Parcel | Rollup |
---|---|---|---|---|
Speed | Very Fast | Moderate | Moderate | Fast |
Configuration | Moderate | High | Low | Moderate |
Plugin Ecosystem | Growing | Mature | Limited | Moderate |
Use Cases | Web Applications, Libraries | Web Applications | Simple Web Applications | JavaScript Libraries |
Practical Examples and Use Cases
ESBuild๋ ๋ค์ํ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
Building a React Application
ESBuild๋ฅผ ์ฌ์ฉํ์ฌ TypeScript ๋ฐ JSX ์ง์์ผ๋ก React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค๋งํ ์ ์์ต๋๋ค. ๋ค์์ ๊ตฌ์ฑ ์์ ๋๋ค.
// esbuild.config.js
const esbuild = require('esbuild');
esbuild.build({
entryPoints: ['src/index.tsx'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm',
minify: true,
sourcemap: true,
jsxFactory: 'React.createElement',
jsxFragment: 'React.Fragment',
loader: {
'.ts': 'tsx',
'.js': 'jsx',
},
}).catch(() => process.exit(1));
์ด ๊ตฌ์ฑ์ ESBuild์ src/index.tsx
ํ์ผ์ ๋ฒ๋ค๋งํ๊ณ JSX ๋ฐ TSX ๊ตฌ๋ฌธ์ ๋ณํํ๊ณ ์์ค ๋งต์ผ๋ก ์ต์ํ๋ ๋ฒ๋ค์ ์์ฑํ๋๋ก ์ง์ํฉ๋๋ค.
Building a Vue.js Application
ESBuild๋ Vue.js ๋จ์ผ ํ์ผ ๊ตฌ์ฑ ์์(.vue
ํ์ผ)๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ง ์์ง๋ง esbuild-plugin-vue3
๊ณผ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ์ง์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. Vue.js๋ ๋์์์์ ๊ฐ์ด ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์์ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค.
// esbuild.config.js
const esbuild = require('esbuild');
const vuePlugin = require('esbuild-plugin-vue3');
esbuild.build({
entryPoints: ['src/main.js'],
bundle: true,
outfile: 'dist/bundle.js',
format: 'esm',
minify: true,
sourcemap: true,
plugins: [vuePlugin()],
}).catch(() => process.exit(1));
์ด ๊ตฌ์ฑ์ esbuild-plugin-vue3
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ .vue
ํ์ผ์ ์ฒ๋ฆฌํ๊ณ Vue.js ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ๋ค๋งํฉ๋๋ค.
Building a Node.js Application
ESBuild๋ฅผ ์ฌ์ฉํ์ฌ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค๋งํ ์๋ ์์ต๋๋ค. ์ด๋ ๋จ์ผ ํ์ผ ์คํ ํ์ผ์ ๋ง๋ค๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์๊ฐ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
// esbuild.config.js
const esbuild = require('esbuild');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
platform: 'node',
format: 'cjs',
minify: true,
sourcemap: true,
}).catch(() => process.exit(1));
์ด ๊ตฌ์ฑ์ ESBuild์ CommonJS ๋ชจ๋ ํ์์ ์ฌ์ฉํ์ฌ Node.js ํ๋ซํผ์ฉ src/index.js
ํ์ผ์ ๋ฒ๋ค๋งํ๋๋ก ์ง์ํฉ๋๋ค.
ESBuild in Different Regions and Environments
ESBuild์ ์๋์ ํจ์จ์ฑ์ ์ ์ธ๊ณ ์น ๊ฐ๋ฐ์์๊ฒ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ๋ค์์ ์๋ก ๋ค๋ฅธ ์ง์ญ ๋ฐ ํ๊ฒฝ์์ ESBuild๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ํ ๋ช ๊ฐ์ง ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
- ๋๋ฆฐ ์ธํฐ๋ท ์ฐ๊ฒฐ: ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฌ๊ฑฐ๋ ๋ถ์์ ํ ์ง์ญ์์๋ ESBuild์ ์์ ๋ฒ๋ค์ ์์ฑํ๋ ๊ธฐ๋ฅ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ ํ๋ ํ๋์จ์ด ๋ฆฌ์์ค: ESBuild์ ๋ฎ์ ๋ฆฌ์์ค ์๋น๋ ๊ตฌํ ๋ฉํฑ ๋๋ ๊ฐ์ ๋จธ์ ๊ณผ ๊ฐ์ด ์ ํ๋ ํ๋์จ์ด ๋ฆฌ์์ค๊ฐ ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
- ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ง์: ESBuild์ ๋์ ํ๊ฒฝ ์ต์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ค์ํ ์ง์ญ์์ ์ฌ์ฉ๋๋ ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ๊ตญ์ ํ ๋ฐ ์ง์ญํ: ESBuild๋ฅผ ๊ตญ์ ํ(i18n) ๋ฐ ์ง์ญํ(l10n) ๋๊ตฌ์ ํตํฉํ์ฌ ๋ค๊ตญ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
Best Practices for Using ESBuild
ESBuild๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
- ๊ตฌ์ฑ ํ์ผ ์ฌ์ฉ: ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ์ฌ ๋น๋ ์ต์ ์ ์ ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋น๋ ํ๋ก์ธ์ค๊ฐ ๋์ฑ ์ฒด๊ณ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํด์ง๋๋ค.
- ์ต์ํ ๋ฐ ํธ๋ฆฌ ์์ดํน ํ์ฑํ: ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ค๋ฉด ํญ์ ์ต์ํ ๋ฐ ํธ๋ฆฌ ์์ดํน์ ํ์ฑํํ์ญ์์ค.
- ์ฝ๋ ๋ถํ ์ฌ์ฉ: ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ฃผ๋ฌธํ์ผ๋ก ๋ก๋ํ ์ ์๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋๋ค.
- ๋์ ํ๊ฒฝ ์ง์ : ์ฝ๋๊ฐ ๋์์ผ๋ก ํ๋ ๋ธ๋ผ์ฐ์ ๋๋ Node.js ๋ฒ์ ๊ณผ ํธํ๋๋์ง ํ์ธํ๋ ค๋ฉด ๋์ ํ๊ฒฝ์ ์ง์ ํ์ญ์์ค.
- ํ๋ฌ๊ทธ์ธ ํ์: ESBuild์ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๋ฅผ ํ์ํ์ฌ ์์ ์ ์๋ํํ๊ณ ๋ค๋ฅธ ๋๊ตฌ์ ํตํฉํ๋ ๋ฐ ๋์์ด ๋๋ ํ๋ฌ๊ทธ์ธ์ ์ฐพ์ผ์ญ์์ค.
- ๋น๋ ์๊ฐ ๋ชจ๋ํฐ๋ง: ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ค๋ฉด ๋น๋ ์๊ฐ์ ์ ๊ธฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ญ์์ค.
Conclusion
ESBuild๋ ์น ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ ์ ์๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ JavaScript ๋ฒ๋ค๋ฌ ๋ฐ ๋ณํ๊ธฐ์ ๋๋ค. ์๋, ๋จ์์ฑ ๋ฐ ์ต์ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ท๋ชจ์ ํ๋ก์ ํธ์ ํ์ํ ์ ํ์ ๋๋ค. ์ด ๊ธฐ์ฌ์ ์ค๋ช ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ESBuild๋ฅผ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์๊ท๋ชจ ์น ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ESBuild๋ ํ๋ฐํธ์๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋์ ํจ์จ์ฑ์ ๋ชจ๋ ์น ๊ฐ๋ฐ์์ ํดํท์ ๊ท์คํ ์์ฐ์ด ๋ฉ๋๋ค. ์น ๊ฐ๋ฐ ํ๊ฒฝ์ด ๊ณ์ ์งํํจ์ ๋ฐ๋ผ ESBuild๋ JavaScript ๋ฒ๋ค๋ง ๋ฐ ๋ณํ์ ์ ๋ ์ฃผ์๋ก ๋จ์ ๊ฐ๋ฐ์๊ฐ ์ ์ธ๊ณ ์ ์ฌ ๊ณ ๊ฐ์ ์ํด ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ ๊ฒ์ ๋๋ค.
ESBuild๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ ๊ณต์ ์ ๋ฐ์ดํธ๋ฅผ ์ฃผ์ํ์ฌ ์ต์ ๊ธฐ๋ฅ๊ณผ ์ต์ ํ๋ฅผ ํ์ฉํ์ญ์์ค. ์ ๋ณด๋ฅผ ์ ์งํ๊ณ ESBuild ์ํ๊ณ์ ์ ๊ทน์ ์ผ๋ก ์ฐธ์ฌํจ์ผ๋ก์จ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ๊ฐ ESBuild๊ฐ ์ ๊ณตํ๋ ์ต์ฒจ๋จ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.